/*
	TESTER
	======
 		Cápsula de Testing v: 1.0

 USA:
 	Clase "Métrica"


 FUNCIONAMIENTO:
	- Itera un arreglo de mallas y le aplica las métricas definidas en la clase "metricas".
	- Guarda los resultados de la evaluación de una métrica en particular en un archivo "nombre_metrica.dat" con el siguiente formato:
		valor_métrica resistencia_malla
	- Se escribe un script para el gnuplot que se encarga de graficar metrica en función de la resistencia (o al revés, no soy bueno en estas cosas).


 TODO: 
	- se podría hacer que plotee todo junto. es una boludez igual
	pero me pareció que así era mejor por el momento. Total es de uso interno en definitiva 

*/

#ifndef __CAPSULE__
#define __CAPSULE__

#include <cassert>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "../metrica/metrica.h"

using namespace std;



class Tester{
	
 public:
 	Tester();	
	Tester(Malla*);
	~Tester();	
	
	void test(double(*f)(const Malla&), Malla*[], int n, string s );
	double floca(const Malla&); //dummy -borrar- 
	void nico(string s, double* a, double* b, int n);


};

void Tester::test( double (*f)(const Malla&), Malla* ptr[], int n, string s ){
	string dataFile = s+".dat";
	
	ofstream data( dataFile.c_str() );
	for(int i = 0; i<n; i++)
		data << f ( *(ptr[i]) ) << " " <<  (*(ptr[i])).getResistencia() << endl;
	//donde dice floca debiera decir Metrica::getResistencia	

	data.close();


	//operaciones para el nombre de archivo del gnuplot
	//y para las llamadas al chmod
	string filename = s+".p";
	//cout << filename << endl;
	//cout << filename.c_str() << endl;
	string permiso = "chmod +x " + filename;
	string run = "./"+filename;

	//escribo el archivo para el gnuplot
	ofstream gnu(filename.c_str());
	gnu << "#!/usr/bin/gnuplot" << endl;
	gnu << "set title \"Funcion " <<  s << "\" " << endl;
	gnu << "set terminal png" << endl;
	gnu << "set output \"" << s << ".png\"" << endl;
	gnu << "set ylabel \"Resistencia (en Ohms)\" " << endl;
	gnu << "plot \"" << dataFile.c_str() << "\" using 1:2 w points  t \"Metrica: " << s << "\" 3" <<  endl;
	
	gnu.close();
	system(permiso.c_str());
	system(run.c_str());
}

void Tester::nico(string s, double* a, double* b, int n){
	string dataFile = s+".dat";
	ofstream data( dataFile.c_str() );
	for(int i = 0; i<n; i++)
		data << a[i] << " " <<  b[i] << endl;
	//donde dice floca debiera decir Metrica::getResistencia	
	data.close();

	//operaciones para el nombre de archivo del gnuplot
	//y para las llamadas al chmod
	string filename = s+".p";
	//cout << filename << endl;
	//cout << filename.c_str() << endl;
	string permiso = "chmod +x " + filename;
	string run = "./"+filename;

	//escribo el archivo para el gnuplot
	ofstream gnu(filename.c_str());
	gnu << "#!/usr/bin/gnuplot" << endl;
	gnu << "set title \"Funcion " <<  s << "\" " << endl;
	gnu << "set terminal png" << endl;
	gnu << "set output \"" << s << ".png\"" << endl;
	gnu << "set ylabel \"Resistencia (en Ohms)\" " << endl;
	gnu << "plot \"" << dataFile.c_str() << "\" using 1:2 w points  t \"Metrica: " << s << "\" 3" <<  endl;
	
	gnu.close();
	system(permiso.c_str());
	system(run.c_str());
}

double Tester::floca(const Malla&){
	return 2;
}

Tester::Tester(){
}

Tester::Tester(Malla* m){
}

Tester::~Tester(){
}
#endif
